package model

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"time"
)

// Trace 工作流追踪日志模型
type Trace struct {
	ID            uint64    `gorm:"primaryKey;column:id" json:"id"`
	Event         string    `gorm:"column:event;type:varchar(50);not null" json:"event"`
	WorkflowRunID string    `gorm:"column:workflow_run_id;type:varchar(64);not null" json:"workflow_run_id"`
	WorkflowID    string    `gorm:"column:workflow_id;type:varchar(64);not null" json:"workflow_id"`
	NodeRunID     string    `gorm:"column:node_run_id;type:varchar(64);not null" json:"node_run_id"`
	NodeID        string    `gorm:"column:node_id;type:varchar(64);not null" json:"node_id"`
	Type          int8      `gorm:"column:type;type:tinyint;not null" json:"type"`
	Data          JSON      `gorm:"column:data;type:json" json:"data"`
	CreatedAt     time.Time `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt     time.Time `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
}

// TableName 指定表名
func (Trace) TableName() string {
	return "traces"
}

// JSON 自定义JSON类型
type JSON json.RawMessage

// Value 实现driver.Valuer接口
func (j JSON) Value() (driver.Value, error) {
	if len(j) == 0 {
		return nil, nil
	}
	return string(j), nil
}

// Scan 实现sql.Scanner接口
func (j *JSON) Scan(value interface{}) error {
	if value == nil {
		*j = nil
		return nil
	}
	s, ok := value.([]byte)
	if !ok {
		return errors.New("invalid scan source")
	}
	*j = append((*j)[0:0], s...)
	return nil
}

// MarshalJSON 实现json.Marshaler接口
func (j JSON) MarshalJSON() ([]byte, error) {
	if j == nil {
		return []byte("null"), nil
	}
	return j, nil
}

// UnmarshalJSON 实现json.Unmarshaler接口
func (j *JSON) UnmarshalJSON(data []byte) error {
	if j == nil {
		return errors.New("null point exception")
	}
	*j = append((*j)[0:0], data...)
	return nil
}
